#include <iostream>
#include <pthread.h>
#include <unistd.h>

void *routine(void *arg)
{
    std::string name = (const char *)arg;
    while (true)
    {
        std::cout << "这是一个正在运行的线程，pid:" << getpid() << std::endl;
        sleep(1);
    }
    return nullptr;
}

// 创建一个线程
void test01()
{
    pthread_t pid = 0;
    int n = pthread_create(&pid, nullptr, routine, (void *)"thread-1");
    while (true)
    {
        std::cout << "这是主线程，pid:" << getpid() << std::endl;
        sleep(1);
    }
}

///////////////////////////////////////////////////////////////////////////////////////
int flag = 100;

void showtid(pthread_t &tid)
{
    printf("0x%lx\n", tid);
}

//同一个函数，两个线程都能使用
std::string FormatId(const pthread_t& tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%ld", tid);
    return id;
}

void *routinee(void *args)
{   
    std::string name = static_cast<const char*>(args);
    pthread_t id = pthread_self();
    int cnt = 5;
    while(cnt)
    {   
        sleep(1);
        std::cout << "这是一个新线程：我的名字：" << name << " id: " << FormatId(id) << std::endl; 
        cnt--;
        flag++;
    }

    return (void*)123;//返回值可以是任何类型，强转即可
}

// 测试线程之间数据的共享属性
void test02()
{
    pthread_t tid = 0;//tid是输出型参数
    int n = pthread_create(&tid, nullptr, routinee, (void *)"thread-1");

    showtid(tid);//证明是输出型参数

    int cnt = 5;

    while(cnt)
    {
        sleep(2);
        std::cout << "我是主线，我的名字：main-thread,我的id:" << FormatId(pthread_self());
        std::cout << ",flag:" << flag << std::endl;
        cnt--; 
    }

    void* ret = nullptr;

    pthread_join(tid, &ret);
    std::cout << "ret is" << (long long int)ret << std::endl;
}

int main()
{
    //test01();
    test02();
    return 0;
}